package org.javahispano.javacup.tacticas_aceptadas.PeterEvans.TheGuarrosFromSwaziland.net.pedroferrera.javacup.core;

import java.awt.Color;
import java.util.LinkedList;
import java.util.List;

import org.javahispano.javacup.tacticas_aceptadas.PeterEvans.TheGuarrosFromSwaziland.net.pedroferrera.javacup.helpers.InterceptorLibreHelper;
import org.javahispano.javacup.tacticas_aceptadas.PeterEvans.TheGuarrosFromSwaziland.net.pedroferrera.javacup.helpers.PorteroHelper;

import org.javahispano.javacup.modelo.Comando;
import org.javahispano.javacup.modelo.ComandoGolpearBalon;
import org.javahispano.javacup.modelo.ComandoIrA;
import org.javahispano.javacup.modelo.Constantes;
import org.javahispano.javacup.modelo.EstiloUniforme;
import org.javahispano.javacup.modelo.JugadorDetalle;
import org.javahispano.javacup.modelo.Posicion;
import org.javahispano.javacup.modelo.SituacionPartido;
import org.javahispano.javacup.modelo.Tactica;
import org.javahispano.javacup.modelo.TacticaDetalle;

/**
 * 
 * "The Guarros From Swaziland" es una t�ctica sencilla fruto de complicadas investigaciones.
 * 
 * Primero de todo se ha tratado de programar una t�ctica basada en campos potenciales (atractivos y repulsivos).
 * A ello se le ha sumado m�dulos m�s anal�ticos en forma de "helpers". Dejando todos los par�metros libres del sistema,
 * un algoritmo gen�tico ha decidido que la mejor t�ctica consiste en chutar a porter�a ya desde antes de medio campo.
 * La investigaci�n final ha determinado la formaci�n en forma de flecha como la m�s �ptima. 
 *  
 * @author Peter Evans
 *
 */
public class TheGuarrosFromSwaziland implements Tactica {

    Posicion alineacion1[]=new Posicion[]{
        new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(-0.951048951048951,-37.53393665158371),
        new Posicion(-1.4265734265734267,-28.269230769230766),
        new Posicion(-1.188811188811189,-17.34162895927602),
        new Posicion(-1.188811188811189,-7.364253393665159),
        new Posicion(-1.188811188811189,3.5633484162895925),
        new Posicion(-1.188811188811189,14.96606334841629),
        new Posicion(-0.951048951048951,27.31900452488688),
        new Posicion(7.608391608391608,40.859728506787334),
        new Posicion(-7.37062937062937,41.0972850678733),
        new Posicion(0.0,45.13574660633484)
    };

    Posicion alineacion2[]=new Posicion[]{
        new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(0.23776223776223776,-44.18552036199095),
        new Posicion(-2.6153846153846154,-39.19683257918552),
        new Posicion(4.5174825174825175,-36.58371040723982),
        new Posicion(-1.6643356643356644,-30.407239819004527),
        new Posicion(-4.041958041958042,-22.330316742081447),
        new Posicion(4.27972027972028,-21.380090497737555),
        new Posicion(-1.6643356643356644,-13.540723981900454),
        new Posicion(-10.937062937062937,-7.601809954751132),
        new Posicion(-1.4265734265734267,-0.7126696832579186),
        new Posicion(4.5174825174825175,-5.226244343891403)
    };

    Posicion alineacion3[]=new Posicion[]{
        new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(-3.5664335664335667,-44.660633484162894),
        new Posicion(3.090909090909091,-44.660633484162894),
        new Posicion(-0.951048951048951,-37.05882352941177),
        new Posicion(-0.23776223776223776,-29.457013574660635),
        new Posicion(-1.6643356643356644,-21.380090497737555),
        new Posicion(-6.6573426573426575,-14.96606334841629),
        new Posicion(1.6643356643356644,-16.866515837104075),
        new Posicion(-10.223776223776223,-6.651583710407239),
        new Posicion(-1.188811188811189,-9.97737556561086),
        new Posicion(6.6573426573426575,-7.839366515837104)
    };

    class TacticaDetalleImpl implements TacticaDetalle {

        public String getNombre() {
            return "The Guarros from Swaziland";
        }

        public String getPais() {
            return "Swaziland";
        }

        public String getEntrenador() {
            return "Peter Evans";
        }

        public Color getColorCamiseta() {
            return new Color(255, 51, 51);
        }

        public Color getColorPantalon() {
            return new Color(0, 0, 0);
        }

        public Color getColorFranja() {
            return new Color(0, 0, 0);
        }

        public Color getColorCalcetas() {
            return new Color(0, 0, 0);
        }

        public Color getColorPortero() {
            return new Color(0, 0, 0);
        }

        public EstiloUniforme getEstilo() {
            return EstiloUniforme.LINEAS_VERTICALES;
        }

        public Color getColorCamiseta2() {
            return new Color(0, 0, 0);
        }

        public Color getColorPantalon2() {
            return new Color(0, 0, 0);
        }

        public Color getColorFranja2() {
            return new Color(21, 144, 218);
        }

        public Color getColorCalcetas2() {
            return new Color(255, 255, 255);
        }

        public Color getColorPortero2() {
            return new Color(143, 182, 235);
        }

        public EstiloUniforme getEstilo2() {
            return EstiloUniforme.LINEAS_VERTICALES;
        }

        class JugadorImpl implements JugadorDetalle {

            String nombre;
            int numero;
            Color piel, pelo;
            double velocidad, remate, presicion;
            boolean portero;
            Posicion posicion;

            public JugadorImpl(String nombre, int numero, Color piel, Color pelo,
                    double velocidad, double remate, double presicion, boolean portero) {
                this.nombre=nombre;
                this.numero=numero;
                this.piel=piel;
                this.pelo=pelo;
                this.velocidad=velocidad;
                this.remate=remate;
                this.presicion=presicion;
                this.portero=portero;
            }

            public String getNombre() {
                return nombre;
            }

            public Color getColorPiel() {
                return piel;
            }

            public Color getColorPelo() {
                return pelo;
            }

            public int getNumero() {
                return numero;
            }

            public boolean esPortero() {
                return portero;
            }

            public double getVelocidad() {
                return velocidad;
            }

            public double getRemate() {
                return remate;
            }

            public double getPresicion() {
                return presicion;
            }
        }
        
        public JugadorDetalle[] getJugadores() {
            return new JugadorDetalle[]{
                new JugadorImpl("Zulu", 1,  new Color(0,0,0), new Color(50,0,0),1.0d,0.5d,0.5d,  true),
                new JugadorImpl("Nguni", 2,  new Color(0,0,0), new Color(50,0,0),1.0d,1.0d,0.5d,  false),
                new JugadorImpl("Xhosa", 3,  new Color(0,0,0), new Color(50,0,0),1.0d,1.0d,0.5d,  false),
                new JugadorImpl("Boers", 4,  new Color(0,0,0), new Color(50,0,0),1.0d,1.0d,0.5d,  false),
                new JugadorImpl("Mswati", 5,  new Color(0,0,0), new Color(50,0,0),1.0d,1.0d,0.5d,  false),
                new JugadorImpl("Transvaal", 6,  new Color(0,0,0), new Color(50,0,0),1.0d,1.0d,0.5d,  false),
                new JugadorImpl("Makhosini", 7,  new Color(0,0,0), new Color(50,0,0),1.0d,1.0d,0.5d,  false),
                new JugadorImpl("Sobhuza", 8,  new Color(0,0,0), new Color(50,0,0),1.0d,1.0d,0.5d,  false),
                new JugadorImpl("Makhosetive", 9,  new Color(0,0,0), new Color(50,0,0),1.0d,1.0d,0.5d,  false),
                new JugadorImpl("Dzeliwe", 10, new Color(0,0,0), new Color(50,0,0),1.0d,1.0d,0.69d, false),
                new JugadorImpl("Sotsha", 11, new Color(0,0,0), new Color(50,0,0),1.0d,1.0d,0.81d, false)
            };
        }
    }

    TacticaDetalle detalle=new TacticaDetalleImpl();
    
    public TacticaDetalle getDetalle() {
        return detalle;
    }

    public Posicion[] getPosicionSaca(SituacionPartido sp) {
    	return alineacion2;
    }

    public Posicion[] getPosicionRecive(SituacionPartido sp) {
    	return alineacion3;
    }

	protected InterceptorLibreHelper interceptor;
	protected PorteroHelper porteroHelper = new PorteroHelper();
	
    public TheGuarrosFromSwaziland() {
       	interceptor = new InterceptorLibreHelper(20, 11, true);
    }
    
    public final static double MUCHO_ANGULO = 40;
    public final static double MEDIO_ANGULO = 20;
    
    public List<Comando> ejecutar(SituacionPartido sp) {
		LinkedList<Comando> list = new LinkedList<Comando>();
    	
		for(int i = 0; i < 11; i++) {
			list.add(new ComandoIrA(i, alineacion1[i]));
		}
		
		/*
		 * El portero se mueve con la recta que va al centro de la porteria
		 */
		Comando cmd = porteroHelper.help(sp, 0);
		if(cmd != null) {
			list.add(cmd);
		}
		
		// El m�s cercano va a por el bal�n
		if(sp.balon().indiceMasCercano(sp.misJugadores()) != 0) {
			list.add(new ComandoIrA(sp.balon().indiceMasCercano(sp.misJugadores()), sp.balon()));
		}
		
		// Todo el equipo trata de interceptar el bal�n, adelant�ndose a �l
		List<Comando> interceptar = interceptor.help(sp, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
		if(interceptar != null) {
			list.addAll(interceptar);
		}
		
		for(int i : sp.puedenRematar()) {
			double angulo = MEDIO_ANGULO;
			if(sp.misJugadores()[i].getY() < 0) {
				angulo = MUCHO_ANGULO;
			} 
			if(sp.saco() && (sp.balon().getY() > ((Constantes.centroArcoSup.getY()) - 20))) {
				/*
				 * Para sacar bien de corner
				 */
				list.add(new ComandoGolpearBalon(i, new 
					Posicion(Constantes.centroArcoSup.getX(), Constantes.centroArcoSup.getY() - 10), 1, MEDIO_ANGULO));
			} else {
	    		// Chutar
				list.add(new ComandoGolpearBalon(i, new 
					Posicion(Constantes.centroArcoSup.getX(), Constantes.centroArcoSup.getY()), 1, angulo));
			}
		}
		
        return list;
    }
}